/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.jms;

import javax.jms.InvalidDestinationException;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Topic;
import javax.jms.TopicPublisher;

/**  
    A client uses a TopicPublisher object to publish messages on a topic. A 
    TopicPublisher object is the publish-subscribe form of a message producer. 
    Normally, the Topic is specified when a TopicPublisher is created. In this
    case, an attempt to use the publish methods for an unidentified 
    TopicPublisher will throw a <code>java.lang.UnsupportedOperationException
    </code>. 

    <p>If the TopicPublisher is created with an unidentified Topic, an attempt
    to use the publish methods that assume that the Topic has been identified 
    will throw a <code>java.lang.UnsupportedOperationException</code>. 

    <p>The following message headers are set as part of publishing a message: 
    <code>JMSDestination, JMSDeliveryMode, JMSExpiration, JMSPriority, 
    JMSMessageID and JMSTimeStamp.</code> 
    
    @author Shrideep Pallickara
    $Revision$
    $Date$
*/

public class JmsTopicPublisher extends JmsMessageProducer 
  implements TopicPublisher, JmsDebugFlags {
  
  /** The Topic this publisher publishes to */
  private Topic topic;
  
  /** The session that this publisher is registered to */
  private JmsTopicSession jmsTopicSession;
  
  /** Created in JmsTopicSession */
  public JmsTopicPublisher(JmsTopicSession jmsTopicSession, Topic topic) {
    this.jmsTopicSession = jmsTopicSession;
    this.topic = topic;
    if (JmsTopicPublisher_Debug) {
      //System.out.println("JmsTopicPublisher:: Initialized publisher with " +
      //"topic (" + topic +")");
    }
  }

  /** Gets the topic associated with this TopicPublisher.
      @return this publisher's topic 
      @exception JMSException - if the JMS provider fails to get the topic 
      for this TopicPublisher due to some internal error.*/
  public Topic getTopic() throws JMSException {
    if (topic == null)
      throw new JMSException("The Topic has not been initialized");
    return topic;
  }
  
  public void publish(Message message) throws JMSException {
    publish(message, getDeliveryMode(), getPriority(), getTimeToLive() );
  }
  
  public void publish(Message message, int deliveryMode,
		      int priority, long timeToLive)  throws JMSException {
    if (topic == null)
      throw new InvalidDestinationException("Uninitialized Topic");
    /** Proceed to publish this message */
    publishMessage(topic, message, deliveryMode, priority, timeToLive);
  }
  
  public void publish(Topic newTopic, Message message) throws JMSException {
    publish(newTopic, message, getDeliveryMode(), 
	     getPriority(), getTimeToLive());
  }
  
  public void publish(Topic newTopic, Message message, int deliveryMode,
		      int priority, long timeToLive) throws JMSException {
    if (newTopic == null)
      throw new InvalidDestinationException("Uninitialized Topic");
    /** Proceed to publish this message */
    publishMessage(newTopic, message, deliveryMode, priority, timeToLive);
  }
  
  private void publishMessage(Topic topic, Message message, int deliveryMode,
			      int priority, long timeToLive)
    throws JMSException {
    /** JMS-NI */
    JmsEvent jmsEvent = new JmsEvent(topic.getTopicName(), message, 
				     deliveryMode, priority, timeToLive);
    
    if (JmsTopicPublisher_Debug) {
      System.out.println("\n" + "JmsTopicPublisher: publishing to topic ->" +
			 topic.getTopicName() + "\n MESSAGE = (" + message 
			 + ") \n" );
    }

    JmsTopicConnection jmsTopicConnection = 
      jmsTopicSession.getJmsTopicConnection();
    
      NBJmsInterconnectionBridge nbBridge = 
	jmsTopicConnection.getNbJmsInterconnectionBridge();
      nbBridge.publishEvent(jmsEvent);
  }
}
